//=========================================================================
// Copyright (C) 2024 The C++ Component Model(COMO) Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//=========================================================================


#include "pmfunction.h"
#include "pminternal.h"

/**
 * pmalloc内部使用的释放内存块函数
 */
void __pmalloc_free(struct mdesc *mdp, void *addr)
{
    const size_t block = BLOCK(addr);

    const int fragtype = mdp->mblkinfo[block].inuse.fragtype;
    switch (fragtype) {
        case 0:
            free_blocks(mdp, block);
            break;

        default:
            free_blockfrag(mdp, block, fragtype, addr);
            break;
    }
}

void pmfree(void *md, void *addr)
{
    struct mdesc *mdp = static_cast<struct mdesc *>(md);
    struct alignlist *list;

    if (addr != nullptr) {
        for (list = mdp->aligned_blocks;  list != nullptr;  list = list->next) {
            if (list->alignedaddr == addr) {
                list->alignedaddr = nullptr;
                addr = list->unalignedaddr;
                break;
            }
        }
        __pmalloc_free(mdp, addr);
        // if (check_heap_free_info(mdp) < 0) exit(1);
    }
}
